--- title: "3、三羊献瑞" created: 2025-11-28 tags: - 算法 --- # 3、三羊献瑞 ## 题目 [三羊献瑞](https://www.lanqiao.cn/problems/674/learning/) ![[image-8daa6c81.png]] ## 思路分析 可以直接暴力枚举每个数 可以观察一下 三能进到五位 说明他一定是1 再往后分析 祥+三(1)能进位 说明一定是9 然后羊一定是0 后面就分析不出什么了 直接循环加上 ![[image-13c32bac.png]] 验算一下就行了 因为它说答案唯一 这道题刷真题卷的时候用的是纯暴力把每个数都套1~9 代码极其夸张 其实可以套用dfs全排列枚举的思路 因为每个字都在0~9之间 且不重复 所以可以先做出全排列 再想办法套给每个字 ![[image-d0bb2f6c.png]] ## 代码实现 **暴力枚举解法** ```cpp #include using namespace std; int main() { int xiang,rui,sheng,hui,san,yang,xian,qi; san=1; int num1,num2,res; for(xiang=0;xiang<=9;xiang++){ for(rui=0;rui<=9;rui++){ for(sheng=0;sheng<=9;sheng++){ for(hui=0;hui<=9;hui++){ for(yang=0;yang<=9;yang++){ for(xian=0;xian<=9;xian++){ for(qi=0;qi<=9;qi++){ if(xiang!=rui && xiang!=sheng && xiang!=hui && xiang!=san && xiang!=yang && xiang!=xian && xiang!=qi && rui!=sheng && rui!=hui && rui!=san && rui!=yang && rui!=xian && rui!=qi && sheng!=hui && sheng!=san && sheng!=yang && sheng!=xian && sheng!=qi && hui!=san && hui!=san && hui!=yang && hui!=xian && hui!=qi && yang!=san && yang!=xian && yang!=qi && xian!=qi && xian!=san && qi!=san){ num1=xiang*1000+rui*100+sheng*10+hui; num2=san*1000+yang*100+xian*10+rui; res=san*10000+yang*1000+sheng*100+rui*10+qi; if(res==num1+num2) cout< using namespace std; const int N=10; int alls[N]; bool st[N]; int ans; void dfs(int u){ if(u==9){ int A=alls[0]*1000+alls[1]*100+alls[2]*10+alls[3]; int B=alls[4]*1000+alls[5]*100+alls[6]*10+alls[1]; int C=alls[4]*10000+alls[5]*1000+alls[2]*100+alls[1]*10+alls[7]; if(A+B==C && B>1000) ans=B; return; } for(int i=0;i<=9;i++){ if(!st[i]){ st[i]=true; alls[u]=i; dfs(u+1); alls[u]=0; st[i]=false; } } } int main() { dfs(0); cout< using namespace std; vector alls={0,1,2,3,4,5,6,7,8,9}; int main() { do{ int A=alls[0]*1000+alls[1]*100+alls[2]*10+alls[3]; int B=alls[4]*1000+alls[5]*100+alls[6]*10+alls[1]; int C=alls[4]*10000+alls[5]*1000+alls[2]*100+alls[1]*10+alls[7]; if(A+B==C && B>1000){ cout<